package com.thirteenClassics.config;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.thirteenClassics.interceptor.JwtTokenAdminInterceptor;
import com.thirteenClassics.json.JacksonObjectMapper;
import com.thirteenClassicsServer.service.impl.FileServiceImpl;

import lombok.extern.slf4j.Slf4j;

/**
 * 配置类，注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    FileServiceImpl fileService;
    @Autowired
    private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;

    /**
     * 注册自定义拦截器
     */
    protected void addInterceptors(InterceptorRegistry registry) {
        //log.info("开始注册自定义拦截器...");
        registry.addInterceptor(jwtTokenAdminInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login");
    }

    /**
     * 设置静态资源映射，主要是访问接口文档（html、js、css）
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //log.info("开始设置静态资源映射...");
        //        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        //        registry.addResourceHandler("/webjars/**").addResourceLocations
        //        ("classpath:/META-INF/resources/webjars/");

        //log.info("图片静态资源映射...Handler->{}---Locations->{};","/" + fileService.pathPattern + "/**","file:" +
        // fileService.filePath);
        //registry.addResourceHandler("/" + fileService.jdbPathPattern + "/**").addResourceLocations("file:" +
        // fileService.jdbFilePath);
        registry.addResourceHandler("/" + fileService.picPathPattern + "/**")
                .addResourceLocations("file:" + "/www/wwwroot/biaozhu/biaozhu_hou/fileStorage/picFileStorage/");
        //registry.addResourceHandler("/" + fileService.picPathPattern + "/**").addResourceLocations("file:" +
        // fileService.picFilePath);
    }

    //    @Bean
    //    public Docket docket1(){
    //        log.info("准备生成接口文档...");
    //        ApiInfo apiInfo = new ApiInfoBuilder()
    //                .title("十三经项目接口文档")
    //                .version("2.0")
    //                .description("十三经项目接口文档")
    //                .build();
    //
    //        Docket docket = new Docket(DocumentationType.SWAGGER_2)
    //                .groupName("管理端接口")
    //                .apiInfo(apiInfo)
    //                .select()
    //                //指定生成接口需要扫描的包
    //                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.admin"))
    //                .paths(PathSelectors.any())
    //                .build();
    //
    //        return docket;
    //    }
    //
    //    @Bean
    //    public Docket docket2(){
    //        log.info("准备生成接口文档...");
    //        ApiInfo apiInfo = new ApiInfoBuilder()
    //                .title("十三经项目接口文档")
    //                .version("2.0")
    //                .description("十三经项目接口文档")
    //                .build();
    //
    //        Docket docket = new Docket(DocumentationType.SWAGGER_2)
    //                .groupName("用户端接口")
    //                .apiInfo(apiInfo)
    //                .select()
    //                //指定生成接口需要扫描的包
    //                .apis(RequestHandlerSelectors.basePackage("com.sky.controller.user"))
    //                .paths(PathSelectors.any())
    //                .build();
    //
    //        return docket;
    //    }

    /**
     * 扩展Spring MVC框架的消息转化器
     */
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //log.info("扩展消息转换器...");
        //创建一个消息转换器对象
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        //需要为消息转换器设置一个对象转换器，对象转换器可以将Java对象序列化为json数据
        converter.setObjectMapper(new JacksonObjectMapper());
        //将自己的消息转化器加入容器中
        converters.add(0, converter);
    }

    //跨域
    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    //是否发送Cookie
                    .allowCredentials(true)
                    //放行哪些原始域
                    .allowedOrigins("*")
                    .allowedMethods("GET", "POST", "PUT", "DELETE")
                    .allowedHeaders("*")
                    .exposedHeaders("*");
        }
    }
}
